Skip to content

Java知识体系

目标: 将现有代码逐步迁移到标准DDD分层结构

现状分析

当前项目模块:

soms-service/  
├── soms-service-application/      57个文件(仅消息处理器等)  
├── soms-service-domain/           362个文件(包含Repository实现)  
├── soms-service-infrastructure/   267个文件 
├── soms-service-common/           少量通用文件 
└── soms-service-start/            1337个文件 
    ├── application/               应用服务  
    ├── domain/                    领域逻辑  
    ├── userinterface/             用户接口  
    ├── helper/                    工具类  
    ├── constant/                  常量(146个文件)  
    └── infrastructure/            基础设施

初步分析建议:

  • 1、考虑添加一下模块:soms-service-adapter/ <-- web controller、API 接口、DTO 转换
  • 2、soms-service-infrastructure 目前放置了实体类和部分网关接口,可以考虑将 domian 模块下 的Repository实现、Tunnel 放在infrastructure
  • 3、模块 application 没有正确使用起来,职责有些分散,目前application服务分散在start和 application 两个模块
  • 4、需要将 start 模块下的文件逐步迁移到其他模块下,仅保留启动类和配置

目标架构

soms-service/
├── soms-service-adapter/          Controller, DTO, RPC, MQ Consumer
├── soms-service-application/      AppService, Assembler, Event
├── soms-service-domain/           Model, Repository接口, DomainService
├── soms-service-infrastructure/   RepositoryImpl, Gateway, Mapper, PO
├── soms-service-common/           通用常量、工具、枚举
└── soms-service-start/            仅启动类和配置

分层架构开发规范

┌─────────────────────────────────────────────────────────┐
│                    Adapter Layer                         │
│  (用户接口层 - 对外暴露接口,适配外部请求)                 │
│  - Web Controller / RPC Service / MQ Consumer            │
└─────────────────┬───────────────────────────────────────┘
                  │ 调用

┌─────────────────────────────────────────────────────────┐
│                 Application Layer                        │
│  (应用层 - 业务流程编排,跨聚合协调)                       │
│  - Application Service / Event Publisher                 │
└─────────────────┬───────────────────────────────────────┘
                  │ 调用

┌─────────────────────────────────────────────────────────┐
│                   Domain Layer                           │
│  (领域层 - 核心业务逻辑,聚合根,领域规则)                  │
│  - Entity / Value Object / Domain Service / Repository   │
└─────────────────┬───────────────────────────────────────┘
                  │ 接口定义
                  ↓ 接口实现(依赖倒置)
┌─────────────────────────────────────────────────────────┐
│               Infrastructure Layer                       │
│  (基础设施层 - 技术实现,外部系统集成)                     │
│  - Repository Impl / Gateway / MQ Producer / Cache       │
└─────────────────────────────────────────────────────────┘

           ┌─────────────────────────────┐
           │      Common Layer            │
           │  (公共层 - 通用工具,常量)     │
           └─────────────────────────────┘

模块职责定义

模块职责包含内容禁止内容
soms-service-adapter用户接口层/适配器层
对外暴露服务接口、请求转换、参数校验
- Web Controller (REST接口)
- RPC Service 实现
- MQ Consumer
- WebSocket Handler
- 接口DTO (Request/Response)
- DTO Convertor (接口DTO↔应用DTO)
❌业务逻辑实现
❌直接调用Domain Service
❌直接操作数据库
❌直接调用外部系统
soms-service-application应用层
业务用例编排、事务、事件发布、权限检查
- Application Service (应用服务)
- Application DTO
- Assembler (DTO↔Domain)
- Event Publisher/Subscriber
❌核心领域逻辑
❌技术实现细节
❌接口细节
soms-service-domain领域层
核心业务逻辑、领域规则、聚合管理、事件定义
- Entity
- Value Object
- Aggregate Root
- Domain Service
- Repository接口
- Domain Event
- Factory
- Specification
- Policy
❌Repository实现类
❌MyBatis/JPA Entity
❌外部调用
❌Spring注解(除领域服务)
❌Tunnel/Gateway实现
❌DTO
soms-service-infrastructure基础设施层
接口实现、外部集成、持久化、技术工具
- Repository实现类
- Mapper/Repository
- PO
- Gateway实现
- MQ Producer
- Cache实现
- 技术配置类
- 工具类
❌业务逻辑
❌领域规则
soms-service-common公共层
通用能力、工具
- 通用常量
- 通用枚举
- 通用异常
- 通用工具类
- 通用注解
❌业务常量
❌业务枚举
❌业务工具类
soms-service-start启动层
应用启动与全局配置
- Application.java
- 配置类
- application.yml/properties
❌application/应用服务
❌domain/领域逻辑
❌userinterface/接口
❌helper/工具
❌constant/常量
❌任何业务代码

标准包结构

soms-service-adapter 包结构

soms-service-adapter/
└── src/main/java/com/shein/somsservice/adapter/
    ├── web/                                    # Web适配器
    │   ├── controller/                         # REST控制器
    │   │   ├── PlatformActivityController.java
    │   │   └── SelfActivityController.java
    │   ├── dto/                                # 接口DTO
    │   │   ├── request/                        # 请求DTO
    │   │   │   ├── CreateActivityRequest.java
    │   │   │   └── UpdateActivityRequest.java
    │   │   └── response/                       # 响应DTO
    │   │       ├── ActivityDetailResponse.java
    │   │       └── ActivityListResponse.java
    │   ├── convertor/                          # DTO转换器
    │   │   └── ActivityWebConvertor.java       # Request/Response ↔ AppDTO
    │   └── filter/                             # Web过滤器
    │       └── AuthFilter.java
    ├── rpc/                                    # RPC适配器
    │   ├── service/                            # RPC服务实现
    │   │   └── ActivityRpcServiceImpl.java
    │   └── dto/                                # RPC DTO
    ├── mq/                                     # 消息队列消费者
    │   ├── consumer/                           # 消费者
    │   │   └── ActivityMessageConsumer.java
    │   └── dto/                                # 消息DTO
    │       └── ActivityMessageDTO.java
    └── job/                                    # 定时任务
        └── ActivitySyncJob.java

soms-service-application 包结构

soms-service-application/
└── src/main/java/com/shein/somsservice/application/
    ├── service/                                # 应用服务
    │   ├── PlatformActivityAppService.java     # 平台活动应用服务
    │   └── SelfActivityAppService.java         # 自营活动应用服务
    ├── dto/                                    # 应用层DTO
    │   ├── ActivityAppDTO.java
    │   └── ProductAppDTO.java
    ├── assembler/                              # 组装器
    │   └── ActivityAssembler.java              # AppDTO ↔ Domain Object
    └── event/                                  # 应用事件
        ├── publisher/                          # 事件发布器
        │   └── ActivityEventPublisher.java
        └── subscriber/                         # 事件订阅器
            └── ActivityEventSubscriber.java

soms-service-domain 包结构

soms-service-domain/
└── src/main/java/com/shein/somsservice/domain/
    ├── platformactivity/                       # 聚合根:平台活动
    │   ├── entity/                             # 实体
    │   │   ├── PlatformActivity.java           # 聚合根
    │   │   └── ActivityProduct.java            # 实体
    │   ├── valueobject/                        # 值对象
    │   │   ├── ActivityTime.java
    │   │   └── DiscountRate.java
    │   ├── service/                            # 领域服务
    │   │   ├── PlatformActivityDomainService.java  # 接口
    │   │   └── impl/
    │   │       └── PlatformActivityDomainServiceImpl.java
    │   ├── repository/                         # 仓储接口
    │   │   └── PlatformActivityRepository.java # ⚠️ 只有接口,无impl
    │   ├── factory/                            # 工厂
    │   │   └── PlatformActivityFactory.java
    │   ├── specification/                      # 规约
    │   │   └── ActivityValidSpecification.java
    │   └── event/                              # 领域事件
    │       └── ActivityCreatedEvent.java
    ├── selfactivity/                           # 聚合根:自营活动
    │   └── ... (同上结构)
    └── shared/                                 # 共享领域概念
        ├── constant/                           # 领域常量
        │   └── ActivityStatus.java
        ├── enums/                              # 领域枚举
        │   └── ActivityType.java
        └── exception/                          # 领域异常
            └── ActivityBusinessException.java

soms-service-infrastructure 包结构

soms-service-infrastructure/
└── src/main/java/com/shein/somsservice/infrastructure/
    ├── persistence/                            # 持久化
    │   ├── dataobject/                         # 数据对象(PO)
    │   │   ├── PlatformActivityPO.java
    │   │   └── ActivityProductPO.java
    │   ├── mapper/                             # MyBatis Mapper
    │   │   └── PlatformActivityMapper.java
    │   ├── repository/                         # 仓储实现
    │   │   └── impl/
    │   │       └── PlatformActivityRepositoryImpl.java  # ✅ 实现Domain接口
    │   ├── convertor/                          # PO转换器
    │   │   └── ActivityPersistenceConvertor.java  # PO ↔ Entity
    │   └── typehandler/                        # 类型处理器
    │       └── JsonTypeHandler.java
    ├── gateway/                                # 外部服务网关(防腐层)
    │   ├── plm/                                # PLM系统网关
    │   │   ├── PlmGateway.java                 # 网关接口(可选)
    │   │   ├── PlmGatewayImpl.java             # 网关实现
    │   │   ├── client/                         # 外部客户端
    │   │   │   └── PlmClient.java
    │   │   ├── request/                        # 外部请求对象
    │   │   │   └── PlmProductRequest.java
    │   │   ├── response/                       # 外部响应对象
    │   │   │   └── PlmProductResponse.java
    │   │   └── convertor/                      # 防腐转换器
    │   │       └── PlmDomainConvertor.java     # 外部对象 ↔ Domain对象
    │   ├── ppc/                                # PPC系统网关
    │   │   └── ... (同上结构)
    │   └── spfm/                               # SPFM系统网关
    │       └── ... (同上结构)
    ├── mq/                                     # 消息队列基础设施
    │   ├── producer/                           # 生产者
    │   │   └── ActivityEventProducer.java
    │   └── config/                             # MQ配置
    │       └── KafkaProducerConfig.java
    ├── cache/                                  # 缓存实现
    │   ├── ActivityCacheManager.java
    │   └── config/
    │       └── RedisConfig.java
    ├── config/                                 # 基础设施配置
    │   ├── DataSourceConfig.java
    │   └── ThreadPoolConfig.java
    └── utils/                                  # 基础设施工具类
        ├── TransactionUtils.java
        └── BatchHelper.java

soms-service-common 包结构

soms-service-common/
└── src/main/java/com/shein/somsservice/common/
    ├── constant/                               # 通用常量
    │   └── CommonConstants.java
    ├── enums/                                  # 通用枚举
    │   └── YesNoEnum.java
    ├── exception/                              # 通用异常
    │   ├── BaseException.java
    │   └── SystemException.java
    ├── util/                                   # 通用工具类
    │   ├── DateUtil.java
    │   ├── StringUtil.java
    │   └── JsonUtil.java
    └── annotation/                             # 通用注解
        └── Trace.java

soms-service-start 包结构

soms-service-start/
├── src/main/java/com/shein/somsservice/
│   ├── Application.java                       # ✅ 启动类
│   └── config/                                # ✅ 全局配置
│       ├── GlobalExceptionHandler.java
│       └── SwaggerConfig.java
└── src/main/resources/
    ├── application.yml                        # ✅ 配置文件
    ├── application-dev.yml
    ├── application-prod.yml
    └── logback-spring.xml

常见的数据对象类型定义

名称所属层次用途/定义数据注解是否包含业务逻辑与数据库映射关系
Entity(实体)domain(领域层)表达核心业务对象,有唯一业务标识,封装业务规则与行为领域相关注解(少量)有(核心业务规则)
Value Object(值对象)domain(领域层)一组不可分割的属性,无唯一标识,业务不可变值有(只读、不可变)
DTO(数据传输对象)application/interface/adaptor(应用、接口、适配层)系统间或前后端数据交换、参数传递校验或序列化注解(可选)可能有/无
PO(持久化对象)infrastructure(基础设施/持久化层)数据库存储对象,与表字段一一映射,做数据持久化ORM/数据库相关注解一一映射数据库表
Model(模型类)多义,各层次均可能出现①页面模型 ②接口交互模型 ③临时/业务模型等项目相关配置通常无(视场景而定)依项目而异

分层开发规范

层级规范对象主要职责与规范禁止/注意事项
AdapterController- 接收/响应 HTTP 请求
- 参数校验
- 调用应用服务
- DTO转换
禁止写业务逻辑
禁止直接操作数据库/领域服务
DTO- 面向接口设计
- 基础类型、校验注解
- 数据交互载体
不包含业务逻辑
ApplicationApplication Service- 业务流程编排
- 跨聚合协调
- 事务管理
- DTO ↔ 领域对象转换
- 应用事件
禁止核心业务逻辑
禁止直连DB/外部系统
Assembler- 负责 DTO 与领域模型互转仅做字段/结构映射,不包含复杂逻辑
DomainEntity- 聚合根
- 业务逻辑实现
- 状态维护/不变性
禁止贫血模型
禁止暴露基础 setter 绕业务规则
Value Object- 不可变
- 业务属性封装
- 内部校验与只读业务逻辑
无 ID,不可变,不含持久化注解
Domain Service- 跨实体业务
- 领域规则(无法归属单一实体)
- 可依赖仓储
- 无状态
禁止技术实现细节
禁止外部系统直接调用
Repository Interface- 领域对象持久化接口
- 领域语义方法签名
- 面向实体/聚合
仅定义接口,不含实现
参数/返回值用领域对象
InfrastructureRepository Impl- 实现 Repository 接口
- Entity ↔ PO 映射
- DB 操作细节
不掺杂业务逻辑
通过注解声明
Gateway- 外部系统调用适配、反腐封装
- 外部模型转领域模型
- 处理异常
禁止领域污染
实现细节只在基础设施层

依赖关系规范

层/模块允许依赖禁止依赖依赖说明
AdapterApplication, CommonDomain, Infrastructure仅依赖应用编排层和通用工具,不直连领域/持久化层
ApplicationDomain, CommonAdapter, Infrastructure只依赖领域模型和通用工具,不能降级/跳跃依赖
DomainCommon, 基础框架(如Spring 可provided)Application, Infrastructure, Adapter, 技术框架(如MyBatis/Redis)核心业务模型,最大程度解耦,仅实现领域本身
InfrastructureDomain(实现接口), Common, 技术框架Application, Adapter仅连接领域接口,持久化/网关/外部集成相关依赖
Common无限制/基础依赖库所有层都可依赖的通用模块,放工具/常量等
Start/启动模块所有层汇总依赖各业务层与基础设施层

命名规范

各层DTO与对象转换规范

迁移计划

迁移规范

  • 1、逐步迁移,从下往上迁移,分阶段迁移,迁移后需要回归验证。
  • 2、新功能严格按照新结构开发
  • 3、迁移期间保持系统稳定,老代码逐步重构

迁移阶段

第一阶段: Infrastructure层(Repository实现、Tunnel)  
	 ↓第二阶段: Domain层纯化  
	 ↓第三阶段: Application层整合  
	 ↓第四阶段: Adapter层激活  
	 ↓第五阶段: Start层瘦身

迁移策略

新老并存

java
// 1. 创建新位置的类  
infrastructure/persistence/repository/impl/PlatformActivityRepositoryImpl.java  
  
// 2. 老位置标记为@Deprecated  
@Deprecated  
domain/platformactivity/repository/impl/PlatformActivityRepositoryMpImpl.java  
  
// 3. 老类委托给新类  
@Deprecated  
public class PlatformActivityRepositoryMpImpl implements PlatformActivityRepository {  
    @Autowired    private PlatformActivityRepositoryImpl newImpl;  
    public Optional<PlatformActivity> findById(Long id) {        return newImpl.findById(id);  // 委托给新实现  
    }}  
  
// 4. 逐步迁移调用方  
// 5. 删除老类

迁移任务

阶段目标/里程碑关键任务与操作迁移/重构对象示例验收标准(关键勾选项)
0准备与基础设施搭建制定规范文档、迁移指引、代码清单、ArchUnit用例、团队培训文档、测试用例、代码清单
1Infrastructure 层迁移与领域纯化Repository 实现迁移,Tunnel → Gateway,Convertor梳理RepositoryMpImpl、Tunnel、Convertor☐ Domain 层无 Repository 实现类
☐ Tunnel 类剥离
☐ 测试通过
2Adapter 层接管接口Adapter 模块搭建,Controller/DTO 迁移Controller、Request/Response DTO☐ Adapter 层覆盖所有 Controller
☐ Controller 只依赖 Application 层
☐ 测试通过
3Application 层整合优化AppService 迁移,DTO 梳理,Assembler 创建Application Service、AppDTO、Assembler☐ 所有功能均由 AppService 管理
☐ Assembler 解耦数据转换
☐ AppService 无业务逻辑
☐ 测试通过
4Domain 层重构与聚合建模Service/Repository迁移归类,聚合根重组,实体充血化Domain Service、Aggregates、Entity☐ 聚合根结构合理
☐ Entity 具备业务方法
☐ 无技术依赖
☐ 测试通过
5工具类与常量规范Helper/Util 类及业务常量、枚举梳理归类Helper、Constant、Enums☐ 工具类/常量目录清理
☐ 分类归类规范
6启动层优化与收口清理无关代码,仅保留启动和全局配置,迁移 DataSource 等Application、配置、辅助类☐ 仅剩启动类及核心配置
☐ 文件数量 < 20
☐ 应用可正常启动

输出内容

    1. DDD 分层规范文档
    1. Skills 功能模块迁移
    1. claude.md 编写规范文档
    1. 项目分层结构清晰,完全符合 DDD 设计原则